package com.yctan.base.utils;

import com.alibaba.druid.support.json.JSONUtils;
import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.profile.DefaultProfile;
import com.google.gson.Gson;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;

/**
 * 阿里云发送短信工具类
 */
@Component
public class AlySendSmsUtils {
    //授权id
    @Value("${aly.sms.accessKeyId}")
    private String accessKeyId;
    //授权key
    @Value("${aly.sms.accessKeySecret}")
    private String accessKeySecret;

    //短信模板
    private static Map<Integer, String> templateCode = new HashMap();
    //短信签名
    private static Map<Integer, String> signName = new HashMap();

    static {
        // 信息变更验证码
        templateCode.put(0, "SMS_200525192");
        // 修改密码验证码
        templateCode.put(1, "SMS_200525193");
        // 用户注册验证码
        templateCode.put(2, "SMS_200525194");
        // 登录异常验证码
        templateCode.put(3, "SMS_200525195");
        // 登录确认验证码
        templateCode.put(4, "SMS_200525196");
        // 身份验证验证码
        templateCode.put(5, "SMS_200525197");
        //供应商补货模板
        templateCode.put(6, "SMS_200184282");
        //智能柜失联提示短信
        templateCode.put(7, "SMS_200721603");

        //验证码签名
        signName.put(0, "邻药");
        //通用签名
        signName.put(1, "牛书科技");
    }

    /**
     * 日志对象
     */
    protected Logger logger = LoggerFactory.getLogger(getClass());

    /**
     * 添加短信模板
     */
    public String addSmsTemplate() throws ClientException {
        // 初始化Client。
        DefaultProfile profile = DefaultProfile.getProfile(
                "cn-chengdu",// API支持的地域ID，如短信API的值为：cn-hangzhou。
                accessKeyId,// 您的AccessKey ID。
                accessKeySecret);// 您的AccessKey Secret。
        IAcsClient client = new DefaultAcsClient(profile);
        CommonRequest addSmsTemplateRequest = new CommonRequest();
        addSmsTemplateRequest.setSysDomain("dysmsapi.aliyuncs.com");
        addSmsTemplateRequest.setSysAction("AddSmsTemplate");
        addSmsTemplateRequest.setSysVersion("2017-05-25");
        // 短信类型。0：验证码；1：短信通知；2：推广短信；3：国际/港澳台消息
        addSmsTemplateRequest.putQueryParameter("TemplateType", "0");
        // 模板名称，长度为1~30个字符
        addSmsTemplateRequest.putQueryParameter("TemplateName", "测试短信模板");
        // 模板内容，长度为1~500个字符
        addSmsTemplateRequest.putQueryParameter("TemplateContent", "您正在申请手机注册，验证码为：${code}，5分钟内有效！");
        // 短信模板申请说明
        addSmsTemplateRequest.putQueryParameter("Remark", "测试");
        CommonResponse addSmsTemplateResponse = client.getCommonResponse(addSmsTemplateRequest);
        String data = addSmsTemplateResponse.getData();
        // 消除返回文本中的反转义字符
        String sData = data.replaceAll("'\'", "");
        Gson gson = new Gson();
        // 将字符串转换为Map类型，取TemplateCode字段值
        Map map = gson.fromJson(sData, Map.class);
        Object templateCode = map.get("TemplateCode");
        return templateCode.toString();
    }

    /**
     * 发送短信
     *
     * @param dataMap      短信模板参数
     * @param PhoneNumbers 电话号码
     * @param templateCode 模板
     * @param signName     签名
     * @return
     * @throws ClientException
     */
    private void sendSms(String dataMap, String PhoneNumbers, String templateCode, String signName) throws ClientException {
        // 初始化Client。
        DefaultProfile profile = DefaultProfile.getProfile(
                "cn-chengdu",// API支持的地域ID，如短信API的值为：cn-hangzhou。
                accessKeyId,// 您的AccessKey ID。
                accessKeySecret);// 您的AccessKey Secret。
        IAcsClient client = new DefaultAcsClient(profile);
        CommonRequest request = new CommonRequest();
        request.setSysDomain("dysmsapi.aliyuncs.com");
        request.setSysVersion("2017-05-25");
        request.setSysAction("SendSms");
        // 接收短信的手机号码
        request.putQueryParameter("PhoneNumbers", PhoneNumbers);
        // 短信签名名称。请在控制台签名管理页面签名名称一列查看（必须是已添加、并通过审核的短信签名）。
        request.putQueryParameter("SignName", signName);
        // 短信模板ID
        request.putQueryParameter("TemplateCode", templateCode);
        // 短信模板变量对应的实际值，JSON格式。
        request.putQueryParameter("TemplateParam", dataMap);
        CommonResponse commonResponse = client.getCommonResponse(request);
        String data = commonResponse.getData();
        String sData = data.replaceAll("'\'", "");
        logger.info("【发送短信反馈】：" + sData);
    }

    @Async
    public void sendSms(Map dataMap, String PhoneNumbers, Integer templateCode, Integer signName) throws ClientException {
        logger.info("【发送短信】给电话" + PhoneNumbers + "发送短信");
        sendSms(JSONUtils.toJSONString(dataMap), PhoneNumbers, AlySendSmsUtils.templateCode.get(templateCode), AlySendSmsUtils.signName.get(signName));
    }

    /**
     * 查询发送详情
     */
    public void querySendDetails(String bizId) throws ClientException {
        // 初始化Client。
        DefaultProfile profile = DefaultProfile.getProfile(
                "cn-chengdu",// API支持的地域ID，如短信API的值为：cn-hangzhou。
                accessKeyId,// 您的AccessKey ID。
                accessKeySecret);// 您的AccessKey Secret。
        IAcsClient client = new DefaultAcsClient(profile);
        CommonRequest request = new CommonRequest();
        request.setSysDomain("dysmsapi.aliyuncs.com");
        request.setSysVersion("2017-05-25");
        request.setSysAction("QuerySendDetails");
        // 接收短信的手机号码
        request.putQueryParameter("PhoneNumber", "156xxxxxxxx");
        // 短信发送日期，支持查询最近30天的记录。格式为yyyyMMdd，例如20191010。
        request.putQueryParameter("SendDate", "20191010");
        // 分页记录数量
        request.putQueryParameter("PageSize", "10");
        // 分页当前页码
        request.putQueryParameter("CurrentPage", "1");
        // 发送回执ID，即发送流水号。
        request.putQueryParameter("BizId", bizId);
        CommonResponse response = client.getCommonResponse(request);
    }


}
